package br.usp.ime.ingpos.testes.services;

import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import org.junit.Before;

import br.com.caelum.vraptor.util.test.MockLocalization;
import br.usp.ime.ingpos.modelo.ProcessoSeletivo;
import br.usp.ime.ingpos.modelo.TipoProcessoSeletivo;
import br.usp.ime.ingpos.modelo.dao.ProcessoSeletivoDao;
import br.usp.ime.ingpos.services.EmailService;
import br.usp.ime.ingpos.services.ProcessoSeletivoService;
import br.usp.ime.ingpos.testes.BancoDeDadosTestCase;

public class ProcessoSeletivoServiceTeste
    extends
        BancoDeDadosTestCase
{

    private static long procSelId = 94298492L;

	public ProcessoSeletivoServiceTeste(
        final String nome )
    {
        super( nome );
    }

    private ProcessoSeletivoService processoSeletivoService;
    private EmailService emailService;
    private Date dataDeAbertura;
    private Date dataLimiteDeInscricao;

    @Before
    protected void setUp()
        throws Exception
    {
        super.setUp();

        processoSeletivoService = new ProcessoSeletivoService( new ProcessoSeletivoDao(
            getSessionCreator() ), emailService, new MockLocalization() );

        final GregorianCalendar calendario = new GregorianCalendar();

        calendario.add( GregorianCalendar.DATE, - 60 );
        dataDeAbertura = calendario.getTime();

        calendario.add( GregorianCalendar.DATE, 120 );
        dataLimiteDeInscricao = calendario.getTime();
    }

    public void testAtualizarProcessoSeletivo()
    {
        final ProcessoSeletivo processoSeletivo = new ProcessoSeletivo();
        processoSeletivo.setDescricao( "Proceso seletivo 1º sem 2011" );
        processoSeletivo.setTipoProcessoSeletivo( TipoProcessoSeletivo.MESTRADO );
        processoSeletivo.setDataDeAbertura( dataDeAbertura );
        processoSeletivo.setDataLimiteDeInscricao( dataLimiteDeInscricao );

        processoSeletivoService.inserirProcessoSeletivo( processoSeletivo );

        assertNotNull( processoSeletivo.getProcessoSeletivoId() );
    }

    public void testBuscarTodosProcessosSeletivos()
    {
        final List<ProcessoSeletivo> processosSeletivos = processoSeletivoService.buscarTodosProcessosSeletivos();

        assertNotNull( processosSeletivos );
        assertFalse( processosSeletivos.isEmpty() );
    }

    public void testBuscarProcessosSeletivosPorData()
    {
        final List<ProcessoSeletivo> processosSeletivos = processoSeletivoService.buscarProcessosSeletivosPorData( new Date() );

        assertNotNull( processosSeletivos );
        assertFalse( processosSeletivos.isEmpty() );
    }

    public void testBuscarProcessoSeletivoVigente()
    {
        final List<ProcessoSeletivo> processosSeletivosVigentes = processoSeletivoService.buscarProcessosSeletivosVigentes();

        assertNotNull( processosSeletivosVigentes );
        assertFalse( processosSeletivosVigentes.isEmpty() );
    }
    
    public void testBuscarProcessoSeletivoVigentePorTipo()
    {
        ProcessoSeletivo processosSeletivoVigente = processoSeletivoService.buscarProcessoSeletivoVigentePorTipo(TipoProcessoSeletivo.MESTRADO);

        assertNotNull( processosSeletivoVigente );
    }
    
    public void testBuscarProcessoSeletivoVigentePorIndice()
    {
        ProcessoSeletivo processosSeletivoVigente = processoSeletivoService.buscarProcessoSeletivoVigentePorTipo(TipoProcessoSeletivo.MESTRADO);
        ProcessoSeletivo processosSeletivo = processoSeletivoService.getProcessoSeletivo(processosSeletivoVigente.getProcessoSeletivoId());

        assertNotNull( processosSeletivo );
        assertEquals(processosSeletivo, processosSeletivoVigente);
    }
    
    public void testFalhaAoInserirProcessoSeletivoEntreDatasExistentes() {
        final ProcessoSeletivo processoSeletivoMesmaData = new ProcessoSeletivo();
       
        processoSeletivoMesmaData.setDescricao( "Proceso seletivo 1º sem 2011" );
        processoSeletivoMesmaData.setTipoProcessoSeletivo( TipoProcessoSeletivo.MESTRADO );
        processoSeletivoMesmaData.setDataDeAbertura( dataDeAbertura );
        processoSeletivoMesmaData.setDataLimiteDeInscricao( dataLimiteDeInscricao );

        processoSeletivoService.inserirProcessoSeletivo( processoSeletivoMesmaData );
    }
    
    public void testBuscarTodosProcessosSeletivosAbertos()
    {
        final List<ProcessoSeletivo> processosSeletivos = processoSeletivoService.buscaProcessosSeletivosAbertos();

        assertNotNull( processosSeletivos );
        assertFalse( processosSeletivos.isEmpty() );
    }
    
    public void testInserirProcessoSeletivoEFecha () {
    	ProcessoSeletivo processoSeletivo = new ProcessoSeletivo();
        processoSeletivoService.inserirProcessoSeletivo(processoSeletivo);
        procSelId = processoSeletivo.getProcessoSeletivoId();
    	processoSeletivo.setDescricao("Teste");
        processoSeletivoService.inserirProcessoSeletivo(processoSeletivo);
        
        ProcessoSeletivo processoSeletivoSalvo = processoSeletivoService.getProcessoSeletivo(procSelId);
        
        assertNotNull (processoSeletivoSalvo);
        assertEquals (processoSeletivoSalvo, processoSeletivo);
        processoSeletivoService.finalizaProcessoSeletivo(processoSeletivoSalvo);
        assertTrue (processoSeletivoSalvo.isProcessoFinalizado());
    }
    
    public void testBuscarTodosProcessosSeletivosFechados () {
        final List<ProcessoSeletivo> processosSeletivos = processoSeletivoService.buscaProcessosSeletivosFechados();

        assertNotNull( processosSeletivos );
        assertFalse( processosSeletivos.isEmpty() );
    }
    
    public void testDeletaProcessoSeletivo () {
        ProcessoSeletivo processoSeletivoSalvo = processoSeletivoService.getProcessoSeletivo(procSelId);
        processoSeletivoService.deletarProcessoSeletivo(processoSeletivoSalvo);
        
        assertNull(processoSeletivoService.getProcessoSeletivo(procSelId));
    }
    
    
}
